java如何在代码中滚动滚动窗格?
我使用ScrollPane,因为它内置了输入和抛出处理。我有一个滚轮的图像,它分为14个部分,滚动窗格本身缩短了两个部分,因此在左右两侧各有一个部分,可以向任意方向滚动。一旦滚动位置到达任一方向的末端,我想将滚动位置重置回中心。一遍又一遍地这样做会产生一种无限滚动的幻觉(希望如此)
我遇到的问题是如何在代码中定位滚动窗格,以便在图像到达任意一端时重置图像。到目前为止,我尝试设置滚动位置的任何操作都不起作用。我尝试过setScrollX()和scrollTo()方法。我还尝试将滚动窗格的大小设置为各种大小(与图像大小相同,并且比图像小两部分)。在设置滚动值之前,我尝试在滚动窗格上调用layout、invalidate和pack,以确保其布局正确。我认为updateVisualScroll()可能会强制它更新滚动位置,但这也没有效果
无论我做什么,它都会忽略所有更改滚动位置的调用,因此我显然遗漏了一些内容。在下面的代码中,我试图让滚轮从图像的中心开始,相反,它的开始位置一直在左边
我还需要能够得到当前的滚动位置,以检测何时它已达到任一端。我尝试重写act()方法并打印出scrollPane。getX(),但即使手动单击并拖动该值以滚动滚动滚动窗格,该值始终为“0”
手动单击和拖动时,滚动确实有效,因此我相信滚动窗格设置正确,我只是无法让它在代码中滚动
这是我的代码,为了简单起见,我去掉了所有的实验代码,因为我的实验都不起作用
public class MyScrollWheel extends Container<ScrollPane> {
private ScrollPane scrollPane;
private Image image;
private int scrollOffset;
public MyScrollWheel(){
Texture texture = new Texture(Gdx.files.internal("internal/scrollwheel.png"));
image = new Image(texture);
scrollOffset = (int)(image.getWidth()/14);
scrollPane = new ScrollPane(image);
scrollPane.setOverscroll(false, false);
setActor(scrollPane);
size(image.getWidth()-(scrollOffset*2), image.getHeight());
scrollPane.setScrollX(scrollOffset); // << this doesn't scroll
scrollPane.updateVisualScroll();
}
}
# 1 楼答案
扩展Menno Gouw的滚轮,我添加了更多功能:
注意:出于我的目的,我在构造函数中使用了一个标签,但是如果不想将它绑定到标签上,可以很容易地更改它
下面是我在手机上录制的演示滚轮的视频
https://www.youtube.com/watch?v=RwVrez4BZsY&feature=youtu.be
-编辑1:布局错误现在已经修复(希望如此)。现在,当在滚动窗格中移动时,它会更新其位置,可绘制的内容会被剪切到演员的边框上
-编辑2:增加了对固定可绘制阴影的支持,以及改变方向盘方向的方法(setRightPositiveDirection())
# 2 楼答案
好吧,我希望能得到一些你可以借鉴的东西。我只是扩展了actor,让它接受纹理,这样我就可以使用纹理了。用
SpriteBatch.draw()
包装并绘制。我现在可以继续滚动它,根据滚动增量,你可以计算出它被滚动了多远。我看不出有任何必要重置方向盘,但如果你真的想重置,你可以执行wheel.setScroll(0);
一个限制是它不是
Drawable
,因此不能像NinePatch
那样缩放。你必须给它一个普通的轮子纹理,画出你想要的大小,你可以添加普通的缩放,但是手动保持纵横比。然后添加边,也许在这些边上叠加一个渐变来创造深度滚轮:
屏幕中的用法:
因此,只需创建一个可耕的轮子纹理,并将其包含在ScrollWheel构造器中。如果你使用这个精确的代码,它会在屏幕中央画轮子
变量
scroll
基本上保存了滚动量,因此如果您想将其限制在0到100之间,只需在setScroll()
中添加此功能即可然后你可以添加一个步骤。因此,如果你想用滑块旋转图像,你可以通过
scroll * 3,6f
或scroll * (maxScroll / maxStep)
来设置旋转我真的很喜欢这个结果,我将在未来使用这个滑块:D。我已经对它进行了一些扩展和修改,您可以在这里看到我的实现:https://youtu.be/RNLk5B-VfYg